#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define kMaxID 6 /* 学号长度*/
#define kMaxName 8 /* 姓名长度 */

typedef struct StuNode {
    char id[kMaxID + 1];
    char name[kMaxName + 1];
    int grade;
} ElemSet;

int CmpID(const void *a, const void *b) {
    /* 比较学号 */
    return strcmp(((const ElemSet*)a)->id,
                  ((const ElemSet*)b)->id);
}

int CmpName(const void *a, const void *b) {
    /* 比较姓名 */
    int ret;
    ret = strcmp(((const ElemSet*)a)->name,
                 ((const ElemSet*)b)->name);
    if (ret == 0) { /* 重名时按学号大小排序 */
        ret = strcmp(((const ElemSet*)a)->id,
                     ((const ElemSet*)b)->id);
    }
    return ret;
}

int CmpGrade(const void *a, const void *b) {
    /* 比较成绩 */
    int ret;
    ret = (((const ElemSet*)a)->grade >
           ((const ElemSet*)b)->grade) ?
          1 : -1;
    if (((const ElemSet *)a)->grade ==
                ((const ElemSet *)b)->grade) { /* 成绩相同时按学号大小排序 */
        ret = strcmp(((const ElemSet*)a)->id,
                     ((const ElemSet*)b)->id);
    }
    return ret;
}

int main(void) {
    ElemSet *a;
    int n, c, i;

    scanf("%d %d\n", &n, &c);
    a = (ElemSet *)malloc(sizeof(ElemSet) * n); /* 声明空间 */
    for (i = 0; i < n; i++) { /* 读入待排序列 */
        scanf("%s %s %d\n", a[i].id, a[i].name, &a[i].grade);
    }
    switch (c) {
    case 1:
        qsort(a, n, sizeof(ElemSet), CmpID);
        break;
    case 2:
        qsort(a, n, sizeof(ElemSet), CmpName);
        break;
    case 3:
        qsort(a, n, sizeof(ElemSet), CmpGrade);
        break;
    default:
        break;
    }
    for (i = 0; i < n; i++) { /* 输出有序序列 */
        printf("%s %s %d\n", a[i].id, a[i].name, a[i].grade);
    }

    return 0;
}